import { ElMessage } from 'element-plus';
import { useMenuStore } from '@/store/menu.js';
import router, { getAllRouter } from '@/router';

let permission = {};
export const routerConfig = () => {
  //使用钩子函数对路由进行跳转权限判断
  router.beforeEach(async (to, from, next) => {
    const menuStore = useMenuStore();
    document.title = `${to.meta.title} | xxx后台管理系统`;
    /* 判断vuex中是否有菜单权限数据 */
    if (to.name !== 'login' && menuStore.menuList.length === 0 && localStorage.getItem('Authorization')) {
      /* 获取菜单以及权限数据 */
      await handleAsyncMemu(menuStore);
    }

    if (to.meta.permission) {
      // 没有登录直接跳转到登录页面
      if (localStorage.getItem('Authorization')) {
        /* 在此处判断对应登录人是否有对应的路由
          1.获取所有的权限判断是否有该路由 ，没有显示404页面
          2.获取登录人对应的路由，没有权限，显示403页面
        */
        // if (to.path === '/dashboard') {
        //   getRouters();
        // }
        let all = false;
        for (let i = 0; i < getAllRouter.length; i++) {
          if (to.path === getAllRouter[i]) {
            all = true;
            break;
          }
        }
        if (!all) {
          next('/404');
        } else {
          /* 403目前不知如何实现，后续加上 */
          next();
          // let limit = false;
          // for (let i = 0; i < routers.length; i++) {
          //   if (to.path === routers[i]) {
          //     limit = true;
          //     break;
          //   }
          // }
          // if (!limit) {
          //   next('/403');
          // } else {
          //   next();
          // }
        }
      } else {
        next('/login');
      }
    } else {
      next();
    }
  });
}

/* 所有路由,每次增加新页面的的时候，都想都需要添加对应的路由 */

/* 处理获取目录与菜单 */
function handleGetMemu (items) {
  if (items.length === 0) return;
  items.forEach((item) => {
    if (item.type === 2) {
      /* 菜单与权限之间的关系,约定w_开头 */
      permission['w_' + item.name] = item.items.map((a) => a.action)
      item.items = [];
    } else if (item.type === 1) {
      handleGetMemu(item.items);
    }
  });
}

/* 判断是否有相同的路由，异常提示 */
function isSameRouter (getAllRouter) {
  if (getAllRouter.length !== [...new Set(getAllRouter)].length) {
    throw ('路由有重复的,请删除相同的路由')
  }
}
isSameRouter(getAllRouter);

/* 异步获取目录与菜单 */
async function handleAsyncMemu (menuStore) {
  try {
    const res = await menuStore.getMyRoleInfo();
    if (res.status === 1) {
      /* 整理菜单 和 权限 */
      handleGetMemu(res.result);
      menuStore.setMenuListInfo(res.result);
      menuStore.setPermissionInfo(permission)
    } else {
      ElMessage.error(res.msg);
    }
  } catch (error) {
    console.log(error);
  }
}


/* 获取父路由 */
// let parents = roles.filter((role) => role.pid === 0).map((role) => {
//   role.children = [];
//   return role;
// }).sort((a,b)=>b.sort-a.sort);
/* 获取子路由 */
// let childrens = roles.filter((role) => role.pid !== 0).map((role) => {
//   role.children = [];
//   return role;
// }).sort((a,b)=>b.sort-a.sort);

/**
 * 把路由权限数据，改造成树形结构的数据
 * @param {*} parents 父路由
 * @param {*} childrens 子路由
 */
function dataToTree (parents, childrens) {
  parents.map((parent) => {
    childrens.map((child, index) => {
      if (parent.id === child.pid) {
        /* 拷贝一份子路由 */
        let _children = JSON.parse(JSON.stringify(childrens));
        /* 删除拷贝的子路由中的pid与父路由中的id相等的数据 */
        _children.splice(index, 1);
        /* 递归遍历 */
        dataToTree([child], _children);
        parent.children.push(child)
      }
    })
  })
}